package org.aoao.utils;

import java.util.Base64;

public class HexTrans {

    //用于建立十六进制字符的输出的小写字符数组
    private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    //用于建立十六进制字符的输出的大写字符数组
    private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };


    /**
     * 将字节数据转化为16进制字符数组
     * 默认使用大写字母
     * @param
     * @return
     */
/*
    public static char[] bytesToCharArray(byte[] data){
        return bytesToCharArray(data, DIGITS_UPPER);
    }
    // 重载，可选择大小写，True为大写，false为小写
    public static char[] bytesToCharArray(byte[] data,boolean isToUpper){
        return bytesToCharArray(data, isToUpper ? DIGITS_UPPER : DIGITS_LOWER);
    }
    private static char[] bytesToCharArray(byte[] data, char[] chars){
        // 获取字节数组长度
        int len=data.length;
        // 一个字节8位，一个十六进制数是4位（16=1<<4），所以字符数组长度需要翻倍
        char[] ret=new char[len<<1];
        // 与运算将字节转为无符号的，再分别取前四位和后四位
        for (int i = 0, j=0; i < len; i++) {
            // 取得前四位后需要右移，避免超出16
            ret[j++] = chars[(0xf0 & data[i]) >> 4];
            ret[j++] = chars[(0xf0 & data[i])];
        }
        return ret;
    }

    public static byte[] charArrayToByte(char[] data){
        int len=data.length;
        */
/*if ((len & 1) != 0){
            // 长度是奇数
            throw new RuntimeException("字符数组长度异常！");
        }*//*

        // 需要返回的字节数组，长度减半
        byte[] ret=new byte[len>>1];
        // i自增，但是j 每次循环会+2
        for (int i = 0, j = 0; j < len; i++) {
            int f=toDigit(data[j],j++);
            f|=toDigit(data[j],j++);
            ret[i]=(byte)(f&0xff);
        }
        return ret;
    }
    // 将16 进制字符 转化为整数
    private static int toDigit(char ch,int index){
        int digit=Character.digit(ch,16);
        if (digit==-1){
            throw new RuntimeException("非法16进制字符 " + ch
                    + " 在索引 " + index);
        }
        return digit;
    }

*/

    //用base64 将字符串text 解码
    public static byte[] base64Bytes(String text){
        return Base64.getDecoder().decode(text);
    }
    //用base64 将字节码data 编码
    public static String base64String(byte[] data){
        return Base64.getEncoder().encodeToString(data);
    }
}
